#include <stdio.h> // perror()/printf()
#include <sys/types.h> // pid_t
#include <wait.h>  // waitpid()
#include <stdlib.h> // exit()
#include <unistd.h> // pipe()/fork()/close()/read()/write()
#include <string.h> // strlen()

int main(int argc, char const *argv[])
{
    //  准备一个2个长度数组 用于接受管道文件描述符 0:读端 1:写端
    int pipe_fd[2];
    // pipe创建管道  获得管道文件描述符
    pipe(pipe_fd);

    // fork子进程 
    pid_t pid = fork();
    if(pid>0)
    {// 1 父进程 //负责写
    //  先关闭读端0
       close(pipe_fd[0]);
    //  write 写入数据
      write(pipe_fd[1],"hello world",strlen("hello world"));
    //  关闭管道写端1
        close(pipe_fd[1]);
    //  等待子进程结束
        waitpid(pid,NULL,0);

    }
    else if(pid==0)
    {
            // 2 子进程 
            //   先关闭写端1
            close(pipe_fd[1]);
            //    read 读取数据
            char buff[1024];
            ssize_t read_size=0;
            // read ：如果有数据，根据buff缓冲大小读取
            //        如果 没有数据 read会阻塞住，直到写端备close
            while( (read_size=read(pipe_fd[0],buff,1024))>0)
            {
                    printf("从父进程获得 数据： %s\n",buff);
            }
            //   关闭管道读端0
            close(pipe_fd[0]);
            //   子进程结束 
            printf("子进程结束\n");
            _exit(EXIT_SUCCESS);

    }
    else
    {
        perror("fork failed ");
        exit(EXIT_FAILURE);
    }
 

    return 0;
}
